home *** CD-ROM | disk | FTP | other *** search
/ Enter 2006 September / Enter 09 2006.iso / Internet / SpamExperts Home 1.1 / SpamExperts Home.exe / lib / spamexperts.modules / spamexperts / license.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-07-14  |  7.0 KB  |  221 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import sys
  5. import types
  6. import urllib
  7. import string
  8. import random
  9. from Crypto.Cipher import AES
  10.  
  11. try:
  12.     import _winreg
  13. except ImportError:
  14.     _winreg = None
  15.  
  16. license_url = 'http://spamexperts.com/cgi-bin/get_license.py?code='
  17. key = 'nHFTCDX9tbPjQXIDjrOYdPuo0SF1ssaU'
  18. crypt = AES.new(key)
  19. remote_key = 'dSxhrnoH4dOBZW8naSDeofcjJwm3S2AS'
  20. remote_crypt = AES.new(remote_key)
  21. if _winreg:
  22.     reg_section = _winreg.HKEY_LOCAL_MACHINE
  23.  
  24. reg_key = 'Software\\SpamExperts'
  25.  
  26. def read_key(name):
  27.     key = _winreg.CreateKey(reg_section, reg_key)
  28.     
  29.     try:
  30.         return eval(_winreg.QueryValueEx(key, name)[0], { }, { })
  31.     except WindowsError:
  32.         pass
  33.  
  34.  
  35.  
  36. def write_key(name, value):
  37.     if not isinstance(value, types.StringTypes):
  38.         raise AssertionError, 'Can only write strings.'
  39.     key = _winreg.CreateKey(reg_section, reg_key)
  40.     _winreg.SetValueEx(key, name, 0, _winreg.REG_SZ, repr(value))
  41.  
  42.  
  43. def remove_key(name):
  44.     key = _winreg.CreateKey(reg_section, reg_key)
  45.     _winreg.DeleteValue(key, name)
  46.  
  47.  
  48. def encrypt(s, crypter = crypt):
  49.     s = s + '.' * (16 - len(s) % 16)
  50.     return crypter.encrypt(s)
  51.  
  52.  
  53. def decrypt(s, crypter = crypt):
  54.     if s is None:
  55.         return s
  56.     
  57.     return crypter.decrypt(s).rstrip('.')
  58.  
  59.  
  60. def store_license(name, address, expiry):
  61.     en_name = encrypt(name)
  62.     en_address = encrypt(address)
  63.     en_expiry = encrypt(str(expiry))
  64.     write_key(encrypt('license_name'), en_name)
  65.     write_key(encrypt('license_address'), en_address)
  66.     write_key(encrypt('license_expiry'), en_expiry)
  67.  
  68.  
  69. def get_stored_license():
  70.     en_name = read_key(encrypt('license_name'))
  71.     en_address = read_key(encrypt('license_address'))
  72.     en_expiry = read_key(encrypt('license_expiry'))
  73.     if en_name is None and en_address is None or en_expiry is None:
  74.         return (None, None, 0.0)
  75.     
  76.     name = decrypt(en_name)
  77.     address = decrypt(en_address)
  78.     expiry = decrypt(en_expiry)
  79.     expiry = float(expiry)
  80.     return (name, address, expiry)
  81.  
  82.  
  83. def get_expiry():
  84.     return get_stored_license()[2]
  85.  
  86.  
  87. def get_code():
  88.     return decrypt(read_key(encrypt('license_code')))
  89.  
  90.  
  91. def remove_code():
  92.     remove_key(encrypt('license_code'))
  93.  
  94.  
  95. def update_license():
  96.     (orig_name, orig_address, orig_expiry) = get_stored_license()
  97.     
  98.     try:
  99.         code = get_code()
  100.         url = license_url + code
  101.         details = urllib.urlopen(url).read()
  102.         (check, data) = details.split('\n', 1)
  103.         (check, name_len, address_len, expiry_len) = check.split(' ')
  104.         name_len = int(name_len)
  105.         address_len = int(address_len)
  106.         expiry_len = int(expiry_len)
  107.         name = data[:name_len]
  108.         address = data[name_len:name_len + address_len]
  109.         expiry = data[name_len + address_len:-1]
  110.         if check != 'license':
  111.             print >>sys.stderr, "Couldn't download license details."
  112.             raise Exception()
  113.         
  114.         name = decrypt(name, remote_crypt)
  115.         address = decrypt(address, remote_crypt)
  116.         expiry = float(decrypt(expiry, remote_crypt))
  117.     except Exception:
  118.         e = None
  119.         print >>sys.stderr, e
  120.         name = orig_name
  121.         address = orig_address
  122.         expiry = orig_expiry
  123.  
  124.     store_license(name, address, expiry)
  125.     return (name, address, expiry)
  126.  
  127. code_characters = string.uppercase + string.digits
  128.  
  129. def number_to_code(x):
  130.     s = []
  131.     while x > 0:
  132.         (x, y) = divmod(x, 10)
  133.         c = y + 10 * random.randint(0, len(code_characters) / 10 - 1)
  134.         s.append(code_characters[c])
  135.     return ''.join(s)
  136.  
  137.  
  138. def code_to_number(x):
  139.     n = 0
  140.     for i, c in enumerate(x.upper()):
  141.         n += 10 ** i * (code_characters.index(c) % 10)
  142.     
  143.     return n
  144.  
  145.  
  146. def generate_code():
  147.     code = []
  148.     for p in (23, 29, 31, 37):
  149.         for i in xrange(5):
  150.             s = _[1](_[1][random.choice(code_characters)])
  151.             n = code_to_number(s)
  152.             n += p - n % p
  153.             if not n % p == 0:
  154.                 raise AssertionError
  155.             ''.join if n > 99999 else []
  156.             answer = number_to_code(n)
  157.             if not code_to_number(answer) == n:
  158.                 raise AssertionError
  159.             if len(answer) == 5:
  160.                 break
  161.                 continue
  162.         code.append(number_to_code(n))
  163.     
  164.     return '-'.join(code)
  165.  
  166.  
  167. def check_license_validity(code = None):
  168.     if code is None:
  169.         code = decrypt(read_key(encrypt('license_code')))
  170.     
  171.     if code is None:
  172.         return False
  173.     
  174.     
  175.     try:
  176.         (a, b, c, d) = [ code_to_number(x) for x in code.split('-') ]
  177.         if b % 29 != 0:
  178.             return False
  179.         
  180.         if c % 31 != 0:
  181.             return False
  182.         
  183.         if d % 37 != 0:
  184.             return False
  185.     except Exception:
  186.         return False
  187.  
  188.     return True
  189.  
  190.  
  191. def get_license(code):
  192.     import MySQLdb
  193.     db = MySQLdb.connect(host = 'localhost', db = 'spam_licenses', user = 'spam_licenses', passwd = 'beSE71rk')
  194.     c = db.cursor()
  195.     c.execute('SELECT * FROM `professional` WHERE `Code`="%s"' % (code,))
  196.     rows = c.fetchall()
  197.     c.close()
  198.     if not rows:
  199.         return 'notfound a b c'
  200.     
  201.     (name, address, expiry, unused) = rows[0]
  202.     en_name = encrypt(name, remote_crypt)
  203.     en_address = encrypt(address, remote_crypt)
  204.     en_expiry = encrypt(str(expiry), remote_crypt)
  205.     return 'license %d %d %d\n%s%s%s' % (len(en_name), len(en_address), len(en_expiry), en_name, en_address, en_expiry)
  206.  
  207.  
  208. def store_code(code):
  209.     write_key(encrypt('license_code'), encrypt(code))
  210.  
  211. if __name__ == '__main__':
  212.     for i in xrange(int(sys.argv[1])):
  213.         code = generate_code()
  214.         if not len(code) == 23:
  215.             raise AssertionError, code
  216.         if not check_license_validity(code):
  217.             raise AssertionError
  218.         print code
  219.     
  220.  
  221.